//app.js

const config = require('./common/config');
const util = require('./utils/util');

var socketOpen = false;
var socketMsgQueue = [];
var SocketTask = null;

App({
    globalData:{
        userInfo:null,
        networkState:false,
        isLogin:false,
        systemInfo:null
    },
    data : {},
    onLaunch: function () {

        //更新版本
        if(wx.canIUse('getUpdateManager')){

            const updateManager = wx.getUpdateManager();

            updateManager.onCheckForUpdate(function (res) {
                // 请求完新版本信息的回调
                util.debug(res.hasUpdate)
            })

            updateManager.onUpdateReady(function () {
                wx.showModal({
                    title: '更新提示',
                    content: '新版本已经准备好，是否重启应用？',
                    success: function (res) {
                        if (res.confirm) {
                            // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                            updateManager.applyUpdate()
                        }
                    }
                })

            })

            updateManager.onUpdateFailed(function () {
                // 新的版本下载失败
            })
        }

        var _this = this;
        /*监听小程序初始化	当小程序初始化完成时，会触发onLaunch（全局只触发一次）*/
        //调用API从本地缓存中获取数据
        var logs = wx.getStorageSync('logs') || []
        logs.unshift(Date.now())
        wx.setStorageSync('logs', logs);

        //网络
        wx.getNetworkType({
            success: function(res) {
                // wifi/2g/3g/4g/unknown(Android下不常见的网络类型)/none(无网络)
                var networkType = res.networkType;
                util.debug("appjs:网络连接状态："+ networkType);
                if(networkType != 'none'){
                    _this.globalData.networkState = true;
                }else{
                    _this.globalData.networkState = false;
                }
            }
        });

        wx.onNetworkStatusChange(function(res) {
            util.debug('appjs:网络连接状态变更：'+res.networkType);
            if(!res.isConnected){
                //toast提示无网络连接
                _this.globalData.networkState = false;
            }else {
                _this.globalData.networkState = true;
            }
        });

        // session校验
        wx.checkSession({
          success: function () {
              //session 未过期，并且在本生命周期一直有效
              /*
              * 1、此处将原本使用的token方式简化为user_id,暂时忽略用户在业务系统中的会话时效
              * */
              // var bizUserId = wx.getStorageSync(config.USER_ID);
              // if(bizUserId=='' || bizUserId==null){
              //     //未登录后端业务系统
              //     systemLogin();
              // }

              /**
               * 2、此处是否会存在当前userId和微信实际用户不符合
               * 场景：用户账号密码登录时同时会自动登录，此时userId与微信自动登录用户不符合 TODO 新增校验
               */
              systemLogin(_this);
          },
          fail: function () {
              //登录态过期，重新登录
              systemLogin(_this);
          }
        })

        //用户授权获取信息
        wx.getUserInfo({
            success: res => {
                // 可以将 res 发送给后台解码出 unionId
                _this.globalData.userInfo = res.userInfo;

                // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
                // 所以此处加入 callback 以防止这种情况
                if (this.userInfoReadyCallback) {
                    this.userInfoReadyCallback(res)
                }
                util.debug("appjs:获取用户信息并设置到全局变量：");
                util.debug(_this.globalData.userInfo);
            }
        })

        //获取系统信息
        wx.getSystemInfo({
            success: function(res) {
                _this.globalData.systemInfo = {
                    model:res.model,
                    width:res.windowWidth,
                    height:res.windowHeight,
                    language:res.language,
                    version:res.version,
                    platform:res.platform,
                    SDKVersion:res.SDKVersion
                }

                util.debug(_this.globalData.systemInfo)
            }
        })

    },
    onShow: function(){
        /*监听小程序显示	当小程序启动，或从后台进入前台显示，会触发*/
    },
    onHide: function(){
        /*监听小程序隐藏	当小程序从前台进入后台，会触发*/
    },
    getUserInfo:function(cb){
        var that = this;
        if(this.globalData.userInfo){
            this.globalData.isLogin = true;
            util.debug("appjs:已获取到全局变量中用户信息");
            typeof cb == "function" && cb(that.globalData.userInfo)
        }else{
            util.debug("appjs:未获取到全局变量中用户信息,尝试重新获取");
            // 微信用户是否授权获取用户信息
            wx.getSetting({
                success: res => {
                    if (res.authSetting['scope.userInfo']){
                        // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
                        wx.getUserInfo({
                            success: res => {
                                // 可以将 res 发送给后台解码出 unionId
                                that.globalData.userInfo = res.userInfo;
                                that.globalData.isLogin = true;

                                // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
                                // 所以此处加入 callback 以防止这种情况
                                if (this.userInfoReadyCallback) {
                                    this.userInfoReadyCallback(res)
                                }

                                typeof cb == "function" && cb(that.globalData.userInfo);
                            }
                        })
                    }else{
                        util.debug("appjs:微信用户信息未获取，用户未授权,尝试让用户主动授权。");
                        wx.openSetting({
                                success: (res) => {
                                util.debug("appjs:用户授权变更,可能需退出小程序清除缓存重试。");
                            }
                        })
                        util.debug("appjs:获取微信用户信息失败");
                        wx.clearStorageSync();
                        that.globalData.isLogin = false;
                        //跳转登录页
                        // wx.reLaunch({
                        //     url: '../../pages/login/index'
                        // })
                    }
                },
                fail:res=>{
                    util.debug("appjs:获取微信用户信息失败");
                    wx.clearStorageSync();
                    that.globalData.isLogin = false;
                    //跳转登录页
                    // wx.reLaunch({
                    //     url: '../../pages/login/index'
                    // })
                }
            })

        }

        util.debug("appjs:当前登录状态："+that.globalData.isLogin)
    },
    scanQrCode:function (cb) {
        // 允许从相机和相册扫码
        wx.scanCode({
            success: (res) => {
                util.debug("appjs:从扫码获取结果成功:")
                typeof cb == "function" && cb(res);
            },
            fail: (res) => {
                util.debug("appjs:从扫码获取结果失败:")
                typeof cb == "function" && cb(res);
            },
        })
    },
    updateWxUserinfo:function () {
        //更新微信用户信息到后端业务系统

        const userId = wx.getStorageSync(config.USER_ID);
        if(userId == '' || userId == null){
            util.debug('appjs:后端系统微信用户相关信息更新失败:userId不存在，检查是否正常登录');
            return;
        }

        wx.request({
            url: config.COMMPT_REQPATH,
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            method:'POST',
            data: {
                accessToken: '',
                refreshToken: '',
                serviceName: 'wxMiniAppService',
                methodName: 'updateWxUserInfo',
                reqData:JSON.stringify({
                    uId:userId,
                    uInfo:this.globalData.userInfo,
                    uLatitude:wx.getStorageSync(config.LOC_LATITUDE),
                    uLongitude:wx.getStorageSync(config.LOC_LONGITUDE)
                })
            },
            success: function (res) {
                var resultData = res.data;
                if(resultData.code == 1){
                    util.debug('appjs:后端系统微信用户相关信息更新成功');
                }else{
                    util.debug('appjs:后端系统微信用户相关信息更新失败:');
                    util.debug(resultData);
                }
            }
        })
    }
});

function systemLogin(thisPage) {
    util.debug('appjs:自动登录中..');
    // 登录，微信登录成功后登录后台业务系统
    wx.login({
            success: res => {
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
            wx.request({
                url: config.COMMPT_REQPATH,
                header: {
                    "Content-Type": "application/x-www-form-urlencoded"
                },
                method:'POST',
                data: {
                    accessToken: '',
                    refreshToken: '',
                    serviceName: 'wxMiniAppService',
                    methodName: 'login',
                    reqData:JSON.stringify({code:res.code})
                },
                success: function (res) {
                    var resultData = res.data;
                    if(resultData.code == 1){
                        util.debug('appjs:后端系统登录成功');
                        wx.setStorageSync(config.USER_ID,resultData.data.userId);


                        //websocket
                        SocketTask = wx.connectSocket({
                            url:config.WEB_SOCKET+"/101/" + resultData.data.userId
                        })

                        wx.onSocketOpen(function (res) {
                            socketOpen = true;
                            util.debug('appjs:websocket已连接')
                        })

                        wx.onSocketError(function (res) {
                            socketOpen = false;
                            util.debug('appjs:websocket连接打开失败：')
                            util.debug(res)
                        })

                        wx.onSocketClose(function(res) {
                            socketOpen = false;
                            util.debug('appjs:websocket已关闭')
                        })

                        wx.onSocketMessage(function(res) {
                            util.debug('appjs:收到服务器内容：' + res.data)
                        })



                    }else{
                        util.debug('appjs:后端系统登录失败');
                        wx.clearStorageSync();
                        //跳转登录页
                        // wx.reLaunch({
                        //     url: '../../pages/login/index'
                        // })
                    }
                },
                fail:function (res) {
                    util.debug('appjs:自动登录出错');
                    wx.clearStorageSync();
                    //跳转登录页
                    // wx.reLaunch({
                    //     url: '../../pages/login/index'
                    // })
                }
            })
        }
    })
}

function sendSocketMessage(msg) {
    if (socketOpen) {
        wx.sendSocketMessage({
            data:msg
        })
    } else {
        socketMsgQueue.push(msg)
    }
}